Skip to main content

Video Statement

Objective

The Video Statement module necessitates users to read aloud pre-configured statements for authentication and verifies if the verbal input from the user match with the statements. It records a high resolution video of the user undergoing the verification process and additionally checks for liveness and face match.

It serves the following verifications:

  • Verifies if the user's verbal input match the displayed statements,
  • Ensures the user is distinctly visible and live which prevents fraudulent attempts using pre-recorded videos,
  • Confirms that the same user completes the entire verification process.
InputOutput
The pre-configured statement(s) for the verification process and the user's selfieIt indicates whether the user's verbal input matches the displayed statements, and provides the outcomes of the liveness and face match evaluations

Benefits of the Video Statement module:

The following is a sample list of the advantages of using the module.

  • Transition from agent-led VKYC to agent-less video KYC.
  • User's confirmation of terms and conditions.
  • User's confirmation of loan amount and interest details.
  • Video-based OTP authentication.
  • Retrieval of user's KYC details via voice input for enhanced verification.
caution

The video recording feature should be enabled to support all the mentioned benefits.

Supported Configurations

Configuration OptionDescription
Verification ChecksConfigure the specific verification checks to be performed for each of the statements.
Nature of ChecksChoose between two verification modes:
  • Synchronous: Checks are evaluated immediately after the user completes the statement recording.
  • Asynchronous: Checks are evaluated independently, allowing users to proceed to the next step without waiting. Verification results are accessible via the audit portal.
Mandatory or non-mandatory checksYou can further configure a check as mandatory or non-mandatory.
  • If a mandatory check fails in case of a synchronous check, the user is rerouted to the statement verification step again and must successfully complete it to proceed further.
  • You can configure a limit for the number of re-attempts a user is allowed for such checks.
  • If a non-mandatory check fails in case of a synchronous check, the user is permitted to continue with the verification process. However, the outcome will accurately indicate the failure of this particular check.
  • For asynchronous mandatory check failures, the configuration can redirect the user to either revisit the specific statement verification step that encountered the failure or initiate a complete verification process retry for them.
Language for StatementsThe statement verification module supports multiple languages.
Statement SequenceDefine the sequence of statements for the verification process based on statement IDs. Configure the next verification statement in case of a verification failure.
Time LimitSet time limits for users to complete each statement verification step. Tailor the time limit to accommodate longer statements and one-time passwords (OTPs).
Conditional Verification StatementsCustomize verification statements to be displayed to specific user categories.
Instruction PagesCreate multiple instruction pages to guide users through the verification process.
Statement Restart LimitEstablish a limit on the number of times a user can restart the verification process for a statement. A restart is triggered when a user fails any of the configured verification checks.
Number of Verification StatementsConfigure any number of verification statements for each user. This could also include a one-time-password (OTP) configured as a verification statement.

Details

You can configure any statement as a part of the verification process.

The statements are divided into two parts:

  1. Static - The part of the statement that remains fixed for all users.
  2. Dynamic - The part of the statement that is dependant on the user. For example, this can be the name of the user, or the principle and interest amount of a loan tailored for them.

The following image shows a sample statement with the static and dynamic part highlighted for your reference.
static_dynamic_sample

Sample Instruction

The following image shows a sample instruction page.

instruction_image

Best Practices

For the best results during the statement verification process, consider the following tips:

  • Speak naturally and clearly, maintaining a consistent volume and tone.
  • Avoid background noise and ensure a quiet environment during the verification process.
  • Enunciate each word properly and adhere to the provided sentence structure.

Success Response Sample

The following code is a sample of a success response from the module.

{
"moduleId": "module_video_statement",
"apiResponse": {
"status": 200,
"details": {
"videoRef": "9b32259c-2aa2-45aa-a75a-46db470bdfbf",
"statements": [
{
"statementId": "id-0+0",
"startTimestamp": "00:00:05",
"endTimestamp": "00:00:13",
"speechToTextMatching": {
"results": {
"match": "no"
},
"apiResponse": {
"sttOutput": "castellon futbol24",
"matchResult": {
"match": false,
"status": "SUCCESS!",
"verbose": "R: CASTELlOn FUTBOLTWEnt**y* FOUR \nH: *JINA lAnGU NI JECInt NyAYIEKA \n\nSimilarity ratio: 0.18518518518518517\nDiff: [['CASTELlOn FUTBOLTWEnt**y* FOUR', '*JINA lAnGU NI JECInt NyAYIEKA']]\nSimilarity too low !!\nR: **Ca*STELLOn* ***FUt****BOL24 \nH: JINa LANGU nI JECINt NYAYIEKA \n\nSimilarity ratio: 0.16666666666666666\nDiff: [['**Ca*STELLOn*', 'JINa LANGU nI'], ['***FUt****BOL24', 'JECINt NYAYIEKA']]\nSimilarity too low !!\n"
}
}
},
"faceDetection": {
"results": {
"inFrame": "yes"
}
},
"liveness": {
"results": {
"live": "yes"
},
"apiResponse": {
"status": "success",
"statusCode": 200,
"metadata": {
"requestId": "1694097262527-6d1c99f0-5fc4-49c3-8f2d-12c07f311bd5",
"transactionId": "PP41734130"
},
"result": {
"details": {
"liveFace": {
"value": "yes",
"confidence": "high"
}
},
"inputImageUrls": {
"image": "<Image_URL>"
},
"summary": {
"action": "pass",
"details": []
}
}
},
"image": "<Image_URL>"
},
"statementText": "Jina langu ni Jecinter Nyayieka.",
"speechToText": "castellon futbol24"
},
{
"statementId": "id-1+0",
"startTimestamp": "00:00:13",
"endTimestamp": "00:00:22",
"speechToTextMatching": {
"results": {
"match": "no"
},
"apiResponse": {
"sttOutput": "because the customer behavior",
"matchResult": {
"match": false,
"status": "SUCCESS!",
"verbose": "R: BECa***u*****S **t**********h*e** Cu****Sto*M BEHAViOR \nH: NINaNUNuA BOOM KUtOKA KWA OChIeNG OuMA KUtoKA SUN KiNG \n\nSimilarity ratio: 0.15384615384615385\nDiff: [['BECa***u*****S', 'NINaNUNuA BOOM'], ['**t**********h*e**', 'KUtOKA KWA OChIeNG'], ['Cu****Sto*M', 'OuMA KUtoKA'], ['BEHAViOR', 'SUN KiNG']]\nSimilarity too low !!\n"
}
}
},
"faceDetection": {
"results": {
"inFrame": "yes"
}
},
"liveness": {
"results": {
"live": "yes"
},
"apiResponse": {
"status": "success",
"statusCode": 200,
"metadata": {
"requestId": "1694097268465-7fad874e-f94d-4bb4-a062-0bd29558ec0b",
"transactionId": "PP41734130"
},
"result": {
"details": {
"liveFace": {
"value": "yes",
"confidence": "high"
}
},
"inputImageUrls": {
"image": "<Image_URL>"
},
"summary": {
"action": "pass",
"details": []
}
}
},
"image": "<Image_URL>"
},
"faceMatch": {
"results": {
"match": "yes"
},
"apiResponse": {
"status": "success",
"statusCode": 200,
"metadata": {
"requestId": "1694097270621-8d271f70-dfb5-4503-9d15-b2b07361d7a9",
"transactionId": "PP41734130"
},
"result": {
"details": {
"match": {
"value": "yes",
"confidence": "high"
}
},
"inputImageUrls": {
"image1": "<Image_URL_1>",
"image2": "<Image_URL_2>"
},
"summary": {
"action": "pass",
"details": []
}
}
},
"image": "<Image_URL>",
"image2": "<Image2_URL>"
},
"statementText": "Ninanunua Boom kutoka kwa Ochieng Ouma kutoka Sun King.",
"speechToText": "because the customer behavior"
},
{
"statementId": "id-2+0",
"startTimestamp": "00:00:22",
"endTimestamp": "00:00:40",
"speechToTextMatching": {
"results": {
"match": "no"
},
"apiResponse": {
"sttOutput": "",
"matchResult": {
"match": false,
"status": "FAILURE: Text Unicode Error!",
"verbose": null
}
}
},
"faceDetection": {
"results": {
"inFrame": "yes"
}
},
"liveness": {
"results": {
"live": "yes"
},
"apiResponse": {
"status": "success",
"statusCode": 200,
"metadata": {
"requestId": "1694097277953-fec524ef-3d2f-492e-8c7d-00bc78f7d5ed",
"transactionId": "PP41734130"
},
"result": {
"details": {
"liveFace": {
"value": "yes",
"confidence": "high"
}
},
"inputImageUrls": {
"image": "<Image_URL>"
},
"summary": {
"action": "pass",
"details": []
}
}
},
"image": "<Image_URL>"
},
"faceMatch": {
"results": {
"match": "yes"
},
"apiResponse": {
"status": "success",
"statusCode": 200,
"metadata": {
"requestId": "1694097280227-543a4c3b-21b8-44ac-806c-6240b47c7a5f",
"transactionId": "PP41734130"
},
"result": {
"details": {
"match": {
"value": "yes",
"confidence": "high"
}
},
"inputImageUrls": {
"image1": "<Image_URL>",
"image2": "<Image_URL>"
},
"summary": {
"action": "pass",
"details": []
}
}
},
"image": "<Image_URL>",
"image2": "<Image_URL>"
},
"statementText": "Bidhaa yangu inakuja na Taa yenye Radio, Stand ya Chuma, Sola ya Jua na Pini Tatu za Kuchaji simu zenye kebo ya USB.",
"speechToText": ""
}
],
"images": {}
}
},
"attempts": "1",
"previousAttempts": []
}

Success Response Details

ObjectFieldDescription
apiResponsestatusThe API response status is 200, indicating a successful request.
apiResponsedetailsAdditional details about the analysis, including video reference and statements.
apiResponse.detailsvideoRefAn identifier for the analyzed video.
apiResponse.detailsstatementsAn array of individual statements within the video.
apiResponse.details.statementsstatementIdA unique identifier for each statement in the video. The identifier's value also involves two parts separated by the "+" symbol. The first part (before the "+") represents the unique statement ID. The second part of the identifier (following the "+") represents the count of the attempt for this particular statement ID in the verification process. For example, the statement ID in the response is "id-0+0", where "id-0" represents the unique statement identifier whereas the "+0" represent that first attempt for this statement. Similarly, the second attempt at verification using this statement will have "id-0+1" as the identifier.
apiResponse.details.statementsstartTimestampThe start time of the statement in the video (e.g., "00:00:05"). This parameter along with the endTimestamp parameter can be used to identify the part of the video where the customer undergoes the statement verification process.
apiResponse.details.statementsendTimestampThe end time of the statement in the video (e.g., "00:00:13"). This parameter along with the startTimestamp parameter can be used to identify the part of the video where the customer undergoes the statement verification process.
apiResponse.details.statementsspeechToTextMatchingInformation about speech-to-text matching for the statement.
apiResponse.details.statements.speechToTextMatchingresultsIndicates whether there was a match or not for speech-to-text.
apiResponse.details.statements.speechToTextMatchingapiResponseAdditional details about the speech-to-text analysis.
note
This apiResponse object and its parameters are optionally displayed depending on your configuration preferences.
apiResponse.details.statements.speechToTextMatching.apiResponsesttOutputThe speech-to-text(STT) output reflects what the module captured and converted to text from the user's spoken inputs for a verification statement.
apiResponse.details.statements.speechToTextMatching.apiResponsematchResultDetails about the match status, status message, and similarity information.
apiResponse.details.statementsfaceDetectionIndicates whether a face was detected in the statement.
apiResponse.details.statementslivenessIndicates whether the face detected appears to be live.
apiResponse.details.statements.liveness.apiResponsestatusThe status of liveness detection is "success" with a statusCode of 200.
apiResponse.details.statements.liveness.apiResponsemetadataMetadata containing requestId and transactionId.
apiResponse.details.statements.liveness.apiResponse.result.details.liveFacevalueIndicates that the face is live with high confidence.
apiResponse.details.statements.liveness.apiResponse.result.details.liveFaceconfidenceHigh confidence in live face detection.
apiResponse.details.statements.liveness.apiResponseinputImageUrlsInput image URLs for liveness detection.
apiResponse.details.statements.liveness.apiResponse.summaryactionThe action is "pass," indicating successful liveness detection.
apiResponse.details.statementsfaceMatchIndicates whether the face detected matches a reference face.
apiResponse.details.statements.faceMatch.apiResponsestatusThe status of face matching is "success" with a statusCode of 200.
apiResponse.details.statements.faceMatch.apiResponse.metadatarequestIdRequest identifier for face matching.
apiResponse.details.statements.faceMatch.apiResponse.metadatatransactionIdTransaction identifier for face matching.
apiResponse.details.statements.faceMatch.apiResponse.result.details.matchvalueFace match result is "yes" with high confidence.
apiResponse.details.statements.faceMatch.apiResponse.result.details.matchconfidenceHigh confidence in face matching.
apiResponse.details.statements.faceMatch.apiResponseinputImageUrlsInput image URLs for face matching.
apiResponse.details.statementsstatementTextThe text extracted from the statement.
apiResponse.details.statementsspeechToTextThe text obtained from the speech-to-text analysis.
apiResponse.details.statementsfaceDetectionIndicates whether a face was detected in the statement.
apiResponse.details.statementslivenessIndicates whether the face detected appears to be live.
apiResponse.details.statementsfaceMatchIndicates whether the face detected matches a reference face.
attemptsIndicates the number of attempts made for this analysis.
previousAttemptsAn array that contains information about previous attempts.
Was this helpful?
Ask AIBeta
Hi! How can I help?
Ask me anything about HyperVerge products, APIs, and SDKs.
Try asking: